package clienteQuery;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;




import banco.Conexao;
import bean.Busca;
import bean.Estado;
import bean.Tipo;

/**
 * @author alberto
 *
 */

public class ClienteDAO  {
	private static ClienteDAO instance = null;
	
	
	public static final int ORDER_NOME=1;
	
	public static final int ORDER_LIMITE_CREDITO=3;
	public static final int ORDER_DATA_CADASTRO=4;
	public static final int ORDER_DATA_ULT_VENDA=5;
	public static final int BUSCA_DATA_ULT_VENDA=5;
	public static final int BUSCA_DATA_CADASTRO=4;
	public static final int BUSCA_NOME=1;
	
	
	public static Vector<String> vectorColuna = null;
	
	public static Vector<String> getVectorColuna() {
		if(vectorColuna == null){
			vectorColuna = new Vector<String>();
			vectorColuna.add("Id");
			vectorColuna.add("Nome");
			vectorColuna.add("Contato");
			vectorColuna.add("CPF/CNPF");
			vectorColuna.add("IE/RG");
			vectorColuna.add("Celular");
			vectorColuna.add("E-mail");
			vectorColuna.add("Fax");
			vectorColuna.add("Município");
		}
		return vectorColuna;
	}

	public  Vector<Tipo> getBuscaPossivel(){
		 Vector<Tipo> vectorBusca = new Vector<Tipo>();
		 vectorBusca.add(new Tipo("Nome",ClienteDAO.BUSCA_NOME));
		 vectorBusca.add(new Tipo("Data",ClienteDAO.BUSCA_DATA_CADASTRO));
		
		 
		 return vectorBusca;
	}
	
	

	
	

	public static ClienteDAO getinstancia() {

		if (instance == null) {
			instance = new ClienteDAO();
		}
		return instance;
	}

	private ClienteDAO() {

	}

	
	
	public int isCnpjCpf(Cliente cliente) throws ClassNotFoundException,SQLException {

	
			int idpessoa = 0;
			
			
	Connection conexao = Conexao.getInstancia().getConexao();
			ResultSet result = conexao.createStatement().executeQuery("select idpessoa from tb_pessoas  where cpf_cnpj="+cliente.getCnpjCpf());

			while (result.next()) {
				idpessoa = result.getInt("idpessoa");
			}

			return idpessoa;
		
			
			
	}

	public int isRgIe(Cliente cliente) throws ClassNotFoundException,SQLException  {
		int idpessoa = 0; 
		Connection conexao = Conexao.getInstancia().getConexao();
		 ResultSet result = conexao.createStatement().executeQuery("select idpessoa from tb_pessoas  where ie_rg="
							+cliente.getRgIe() );

			while (result.next()) {
				idpessoa = result.getInt("idpessoa");
			}

			return idpessoa;

	}
	
	
	
	public int isEmail(Cliente cliente) throws ClassNotFoundException,SQLException  {
		int idpessoa=0;
		Connection conexao = Conexao.getInstancia().getConexao(); 
		ResultSet result = conexao.createStatement().executeQuery("select idpessoa from tb_pessoas  where email=(SELECT lower('"
							+ cliente.getEmail()+"'))");

			while (result.next()) {
				idpessoa = result.getInt("idpessoa");
			}

			return idpessoa;

		
	}
	
	public boolean add(Cliente cliente) throws ClassNotFoundException,SQLException {

		
			
		
				Conexao.getInstancia().desconectar();
				Connection conexao = Conexao.getInstancia().getConexao();
			
				conexao.setAutoCommit(true);
			String sql = "insert into tb_pessoas(nome,celular,contato,ie_rg,email,telefone,fax,cpf_cnpj,observacao,idestado,municipio,logradouro,bairro,cep)" +
					"values( UPPER('"+cliente.getNome()+"'),"+
											cliente.getCelular()+", UPPER('"+
											cliente.getContato()+"'),"+
											cliente.getRgIe()+", LOWER('"+
											cliente.getEmail()+"'),"+
											cliente.getTelefone()+","+
											cliente.getFax()+","+
											cliente.getCnpjCpf()+",'"+
											cliente.getObs() +"v',"+
											cliente.getUf().getId()+",UPPER('"+
											cliente.getMunicipio()+"'),UPPER('"+
											cliente.getEndereco()+"'),UPPER('"+
											cliente.getBairro()+"'),"+
											cliente.getCep()+")";
			String sql1 = "insert into tb_cliente(nome_pai,nome_mae,conjuge,profissao,natural_de,limite_credito,idpessoa,nascido_em)" +
										"values(UPPER('"+cliente.getPai()+"')," +
										"UPPER('"+cliente.getMae()+"')," +
										"UPPER('"+cliente.getConjugue()+"')," +
										"UPPER('"+cliente.getProfissao()+"')," +
										"UPPER('"+cliente.getNatural()+"')," +
										""+cliente.getLimitCred()+",LAST_INSERT_ID(),"+cliente.getNascido()+")";
		System.out.print(sql1);
		
			Statement stat = conexao.createStatement();
			
			stat.executeUpdate(sql);
			stat.executeUpdate(sql1);
			//conexao.commit();
			stat.close();
			conexao.close();
		
			return true;
		

	}
	
	public boolean editar(Cliente cliente)throws ClassNotFoundException,SQLException {

				
					String sql = "update  tb_pessoas set" +
							" nome=(SELECT UPPER('"+ cliente.getNome()+ "'))," +
							"celular="+ cliente.getCelular()+
							",contato=(SELECT UPPER('"+ cliente.getContato()+"'))"+
							",ie_rg="+cliente.getRgIe()+
							",email=(SELECT LOWER('"+ cliente.getEmail()+"'))"+
							",telefone="+cliente.getTelefone()+
							",fax="+cliente.getFax()+
							",cpf_cnpj="+cliente.getCnpjCpf()+
							",observacao='"+cliente.getObs()+
							"',idestado="+cliente.getEstado().getId()+
							",municipio=(SELECT UPPER('"+ cliente.getMunicipio()+"'))"+
							",logradouro=(SELECT UPPER('"+ cliente.getEndereco()+"'))"+
							",bairro=(SELECT UPPER('"+ cliente.getBairro()+"'))"+
							",cep="+cliente.getCep()+" where idpessoa="+cliente.getId();
							
		
					String sql1 = "update  tb_cliente set nome_pai=(SELECT UPPER('"+ cliente.getPai()+"'))"+
					",nome_mae=(SELECT UPPER('"+cliente.getMae()+"'))"+
					",conjuge=(SELECT UPPER('"+ cliente.getConjugue()+"'))"+
					",profissao=(SELECT UPPER('"+ cliente.getProfissao()+"'))"+
					",natural_de=(SELECT UPPER('"+cliente.getNatural()+"'))"+
					",limite_credito="+ cliente.getLimitCred()+" where idpessoa="+cliente.getId();
					 
					Conexao.getInstancia().desconectar();
					
					Connection conexao = Conexao.getInstancia().getConexao();
					
					Statement stat = conexao.createStatement();
					conexao.setAutoCommit(false);
					
					if(stat.executeUpdate(sql)==0){
						conexao.rollback();
						
						stat.close();
						return false;
						}
					
					
					if(stat.executeUpdate(sql1)==0){
						conexao.rollback();
						stat.close();
						return false;
						}
				
					conexao.commit();
					stat.close();
					
					return true;
					
		
	}
	
	/**
	 * @author alberto
	 * @param order = campo para ordenar , inic = valor onde inicia a pagina ,limit = limite de registrs por parginas
	 */
	
	public Vector<Cliente> getListClinte(int valueBusca,String buscar, int order, int inic, int quant)throws ClassNotFoundException,SQLException  {
		
		
		
			Connection conexao=Conexao.getInstancia().getConexao(); 
			
			String condicao ="";
			if(valueBusca!=0 && buscar!=null){
				if(valueBusca== ClienteDAO.BUSCA_NOME){
					condicao=" and pe.nome  like '"+buscar+"%'";
				}
				
			}
			
			String format = condicao+" order by  pe.nome   limit 0, 10";
			switch (order) {
			case 1:
				format = condicao+" order by  pe.nome  limit " + inic + ", "
						+ quant;
				break;

			case 4:
				format = condicao+" order by  pe.data_cadastro  limit " + inic
						+ " , " + quant;
				break;

			case 3:
				format = condicao+" order by  cli.limite_credito  limit " + inic + " , "
						+ quant;
				break;
			
			case 5: /// falta emplemetar
				format = condicao+" order by  cli.ult_venda  limit " + inic + ", "
				+ quant;
				break;
			
			
			default: /// falta emplemetar
				format = " order by  pe.nome   limit " + inic + " , "+ quant;
				break;
			
			}
	
			
			
			ResultSet result = conexao.createStatement().executeQuery("select cli.idcliente as id," +
															  "cli.profissao as profiss," +
															  "cli.idpessoa as idpessoa," +
															  "cli.nome_pai as pai," +
															  "cli.nome_mae as mae," +
															  "cli.conjuge as conjuge," +
															  "cli.nascido_em as nasc_em," +
															  "cli.limite_credito as credito," +
															  "cli.natural_de as natur," +
															  "cli.ult_venda as ult_venda," +
															  "pe.nome as nome," +
															  "pe.telefone as tel," +
															  "pe.celular as cel," +
															  "pe.logradouro as endereco," +
															  "pe.bairro as bairro," +
															  "pe.data_cadastro as cadast_em," +
															  "pe.contato," +
															  "pe.ie_rg," +
															  "pe.cpf_cnpj," +
															  "pe.cep," +
															  "pe.idestado," +
															  "pe.email," +
															  "pe.municipio," +
															  "pe.fax  " +
									"from tb_cliente cli,tb_pessoas pe where pe.idpessoa=cli.idpessoa "+ format);
			Vector<Cliente> clientes = new Vector<Cliente>();

			while (result.next()) {
				Cliente cliente = new Cliente();
				cliente.setId(result.getInt("idpessoa"));
				cliente.setId(result.getInt("id"));
				cliente.setProfissao(result.getString("profiss"));
				cliente.setNascido(result.getString("nasc_em"));
				cliente.setUltVenda(result.getTimestamp("ult_venda"));
				cliente.setNome(result.getString("nome"));
				cliente.setTelefone(result.getString("tel"));
				cliente.setLimitCred(result.getDouble("credito"));
				cliente.setPai(result.getString("pai"));
				cliente.setMae(result.getString("mae"));
				cliente.setConjugue(result.getString("conjuge"));
				cliente.setNatural(result.getString("natur"));
				cliente.setEndereco(result.getString("endereco"));
				cliente.setBairro(result.getString("bairro"));
				cliente.setCadastro(result.getTimestamp("cadast_em"));
				cliente.setContato(result.getString("contato"));
				Estado estado=  new Estado();
				estado.setId(result.getInt("idestado"));
				cliente.setUf( estado);
				cliente.setEmail(result.getString("email"));
				cliente.setMunicipio(result.getString("municipio"));
				cliente.setRgIe(result.getString("ie_rg"));
				cliente.setCnpjCpf(result.getString("cpf_cnpj"));
				cliente.setCelular(result.getString("cel"));
				cliente.setFax(result.getString("fax"));
				clientes.add(cliente);
			}
			return clientes;

	
	}

	public Cliente getClinte(int id_cliente)throws SQLException, ClassNotFoundException  {
		
		Connection conexao=Conexao.getInstancia().getConexao(); 
		

	
			ResultSet result = conexao.createStatement().executeQuery("select "+
										"cli.idcliente as id,"+
										"cli.profissao as profiss,"+
										"cli.idpessoa as idpessoa,"+
										"cli.nome_pai as pai,"+
										"cli.nome_mae as mae,"+
										"cli.conjuge as conjuge,"+
										"cli.nascido_em as nasc_em,"+
										"cli.limite_credito as credito,"+
										"cli.natural_de as natur,"+
										"cli.ult_venda as ult_venda,"+
										"cli.limite_credito as credito,"+
										"pe.nome as nome,"+
										"pe.telefone as tel,"+
										"pe.celular as cel,"+
										"pe.logradouro as endereco,"+
										"pe.bairro as bairro,"+
										"pe.data_cadastro as cadast_em,"+
										"pe.observacao as obs ,"+
										"pe.email as email,"+
										"pe.ie_rg as ie_rg,"+
										"pe.municipio as municip,"+
										"pe.fax as fax,"+
										"pe.cpf_cnpj as cpf_cnpj,"+
										"pe.cep as cep,"+
										"pe.idestado as idestado,"+
										"pe.contato as contato "+
										
							"from tb_cliente cli,tb_pessoas pe where pe.idpessoa=cli.idpessoa and  cli.idcliente="+id_cliente);
	
			Cliente cliente= null;
			while (result.next()) {
				/*
				 * String bairro,
			String celular, String cep, String contato,
			String cpf_cnpj, String email, String fax, String ie_rg,
			String lougradoro, String municipio, String nome, int numero,
			String obs, String telefone, int idestado,String nome_pai,String nome_mae,
			String nascido_em,String cadastro,String conjuge,String profissao,
			String natural_de,Double limite_cred
				 */
				cliente = new Cliente();
				cliente.setBairro(result.getString("bairro"));
				cliente.setCelular(result.getString("cel"));
				cliente.setCep(result.getString("cep"));
				cliente.setContato(result.getString("contato"));
				cliente.setCnpjCpf(result.getString("cpf_cnpj"));
				cliente.setEmail(result.getString("email"));
				cliente.setFax(result.getString("fax"));
				cliente.setRgIe(result.getString("ie_rg"));
				cliente.setEndereco(result.getString("endereco"));
				cliente.setMunicipio(result.getString("municip"));
				cliente.setNome(result.getString("nome"));
				cliente.setObs(result.getString("obs"));
				cliente.setTelefone(result.getString("tel"));
				Estado estado=new Estado();
				estado.setId(result.getInt("idestado"));
				cliente.setEstado(estado);
				cliente.setPai(result.getString("pai"));
				cliente.setMae(result.getString("mae"));
				cliente.setNascido(result.getString("nasc_em"));
				cliente.setCadastro(result.getTimestamp("cadast_em"));
				cliente.setConjugue(result.getString("conjuge"));
				cliente.setProfissao(result.getString("profiss"));
				cliente.setNatural(result.getString("natur"));
				cliente.setLimitCred(result.getDouble("credito"));
				
				cliente.setId(result.getInt("idpessoa"));
				
		
				cliente.setUltVenda(result.getTimestamp("ult_venda"));
			}
		return cliente;
	}

	public   Vector<Estado> getEstados() throws ClassNotFoundException,SQLException{
		
		Statement statement = Conexao.getInstancia().getConexao().createStatement();
		
			ResultSet result = statement.executeQuery("select idestado,nome,sigla from tb_estado order by sigla ");
			Vector<Estado> estados = new Vector<Estado>();
			
			while (result.next()) {
				estados.add(new Estado(result.getInt("idestado"),result.getString("nome"),result.getString("sigla")));
				
			}
			statement.close();
			return estados;
	
	}

}
